<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/uaccess.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/uaccess.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfVUFDQ0VTU19IXzA_"><span class="b">_ASM_X86_UACCESS_H</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0FTTV9YODZfVUFDQ0VTU19IXzA_"><span class="b">_ASM_X86_UACCESS_H</span></a>
<a name="3" /><span class="True">       3:</span> <span class="k">/*</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * User space memory access functions</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> */</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">errno</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="True">       7:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">compiler</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="8" /><span class="True">       8:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">thread_info</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="9" /><span class="True">       9:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">string</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="10" /><span class="True">      10:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="m">asm</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="11" /><span class="True">      11:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">page</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="12" /><span class="True">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">smap</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="True">      13:</span> 
<a name="14" /><span class="True">      14:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VkVSSUZZX1JFQURfMA__"><span class="b">VERIFY_READ</span></a> <span class="c">0</span>
<a name="15" /><span class="True">      15:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VkVSSUZZX1dSSVRFXzA_"><span class="b">VERIFY_WRITE</span></a> <span class="c">1</span>
<a name="16" /><span class="True">      16:</span> 
<a name="17" /><span class="True">      17:</span> <span class="k">/*</span>
<a name="18" /><span class="True">      18:</span> <span class="k"> * The fs value determines whether argument validity checking should be</span>
<a name="19" /><span class="True">      19:</span> <span class="k"> * performed or not.  If get_fs() == USER_DS, checking is performed, with</span>
<a name="20" /><span class="True">      20:</span> <span class="k"> * get_fs() == KERNEL_DS, checking is bypassed.</span>
<a name="21" /><span class="True">      21:</span> <span class="k"> *</span>
<a name="22" /><span class="True">      22:</span> <span class="k"> * For historical reasons, these macros are grossly misnamed.</span>
<a name="23" /><span class="True">      23:</span> <span class="k"> */</span>
<a name="24" /><span class="True">      24:</span> 
<a name="25" /><span class="True">      25:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TUFLRV9NTV9TRUdfMA__"><span class="b">MAKE_MM_SEG</span></a><span class="f">(</span><span class="b">s</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">mm_segment_t</span><span class="f">)</span> <span class="f">{</span> <span class="f">(</span><span class="b">s</span><span class="f">)</span> <span class="f">}</span><span class="f">)</span>
<a name="26" /><span class="True">      26:</span> 
<a name="27" /><span class="True">      27:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_S0VSTkVMX0RTXzA_"><span class="b">KERNEL_DS</span></a>    <a href="cpu.c_macros_noref.html#_TUFLRV9NTV9TRUdfMA__"><span class="b">MAKE_MM_SEG</span></a><span class="f">(</span><span class="f">-</span><span class="c">1UL</span><span class="f">)</span>
<a name="28" /><span class="True">      28:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_VVNFUl9EU18w"><span class="b">USER_DS</span></a>     <a href="cpu.c_macros_noref.html#_TUFLRV9NTV9TRUdfMA__"><span class="b">MAKE_MM_SEG</span></a><span class="f">(</span><a href="cpu.c_macros_noref.html#_VEFTS19TSVpFX01BWF8w"><span class="b">TASK_SIZE_MAX</span></a><span class="f">)</span>
<a name="29" /><span class="True">      29:</span> 
<a name="30" /><span class="True">      30:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Z2V0X2RzXzA_"><span class="b">get_ds</span></a><span class="f">(</span><span class="f">)</span>    <span class="f">(</span><a href="cpu.c_macros_noref.html#_S0VSTkVMX0RTXzA_"><span class="b">KERNEL_DS</span></a><span class="f">)</span>
<a name="31" /><span class="True">      31:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Z2V0X2ZzXzA_"><span class="b">get_fs</span></a><span class="f">(</span><span class="f">)</span>    <span class="f">(</span><span class="b">current_thread_info</span><span class="f">(</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">addr_limit</span><span class="f">)</span>
<a name="32" /><span class="True">      32:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c2V0X2ZzXzA_"><span class="b">set_fs</span></a><span class="f">(</span><span class="b">x</span><span class="f">)</span>    <span class="f">(</span><span class="b">current_thread_info</span><span class="f">(</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">addr_limit</span> <span class="f">=</span> <span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">)</span>
<a name="33" /><span class="True">      33:</span> 
<a name="34" /><span class="True">      34:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c2VnbWVudF9lcV8w"><span class="b">segment_eq</span></a><span class="f">(</span><span class="b">a</span><span class="f">,</span> <span class="b">b</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">a</span><span class="f">)</span><span class="f">.</span><span class="b">seg</span> <span class="f">==</span> <span class="f">(</span><span class="b">b</span><span class="f">)</span><span class="f">.</span><span class="b">seg</span><span class="f">)</span>
<a name="35" /><span class="True">      35:</span> 
<a name="36" /><span class="True">      36:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dXNlcl9hZGRyX21heF8w"><span class="b">user_addr_max</span></a><span class="f">(</span><span class="f">)</span> <span class="f">(</span><span class="b">current_thread_info</span><span class="f">(</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">addr_limit</span><span class="f">.</span><span class="b">seg</span><span class="f">)</span>
<a name="37" /><span class="True">      37:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19hZGRyX29rXzA_"><span class="b">__addr_ok</span></a><span class="f">(</span><span class="b">addr</span><span class="f">)</span>     \
<a name="38" /><span class="True">      38:</span>     <span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a><span class="f">)</span><span class="f">(</span><span class="b">addr</span><span class="f">)</span> <span class="f">&lt;</span> <a href="cpu.c_macros_noref.html#_dXNlcl9hZGRyX21heF8w"><span class="b">user_addr_max</span></a><span class="f">(</span><span class="f">)</span><span class="f">)</span>
<a name="39" /><span class="True">      39:</span> 
<a name="40" /><span class="True">      40:</span> <span class="k">/*</span>
<a name="41" /><span class="True">      41:</span> <span class="k"> * Test whether a block of memory is a valid user space address.</span>
<a name="42" /><span class="True">      42:</span> <span class="k"> * Returns 0 if the range is valid, nonzero otherwise.</span>
<a name="43" /><span class="True">      43:</span> <span class="k"> *</span>
<a name="44" /><span class="True">      44:</span> <span class="k"> * This is equivalent to the following test:</span>
<a name="45" /><span class="True">      45:</span> <span class="k"> * (u33)addr + (u33)size &gt; (u33)current-&gt;addr_limit.seg (u65 for x86_64)</span>
<a name="46" /><span class="True">      46:</span> <span class="k"> *</span>
<a name="47" /><span class="True">      47:</span> <span class="k"> * This needs 33-bit (65-bit for x86_64) arithmetic. We have a carry...</span>
<a name="48" /><span class="True">      48:</span> <span class="k"> */</span>
<a name="49" /><span class="True">      49:</span> 
<a name="50" /><span class="True">      50:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19yYW5nZV9ub3Rfb2tfMA__"><span class="b">__range_not_ok</span></a><span class="f">(</span><span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">,</span> <span class="b">limit</span><span class="f">)</span>                \
<a name="51" /><span class="True">      51:</span> <span class="f">(</span><span class="f">{</span>                                    \
<a name="52" /><span class="True">      52:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flag</span><span class="f">,</span> <span class="b">roksum</span><span class="f">;</span>                    \
<a name="53" /><span class="True">      53:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">;</span>                        \
<a name="54" /><span class="True">      54:</span>     <span class="m">asm</span><span class="f">(</span><span class="e">&quot;add %3,%1 ; sbb %0,%0 ; cmp %1,%4 ; sbb $0,%0&quot;</span>        \
<a name="55" /><span class="True">      55:</span>         <span class="f">:</span> <span class="e">&quot;=&amp;r&quot;</span> <span class="f">(</span><span class="b">flag</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span> <span class="f">(</span><span class="b">roksum</span><span class="f">)</span>                \
<a name="56" /><span class="True">      56:</span>         <span class="f">:</span> <span class="e">&quot;1&quot;</span> <span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;g&quot;</span> <span class="f">(</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">)</span><span class="f">,</span>                \
<a name="57" /><span class="True">      57:</span>           <span class="e">&quot;rm&quot;</span> <span class="f">(</span><span class="b">limit</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>                        \
<a name="58" /><span class="True">      58:</span>     <span class="b">flag</span><span class="f">;</span>                                \
<a name="59" /><span class="True">      59:</span> <span class="f">}</span><span class="f">)</span>
<a name="60" /><span class="True">      60:</span> 
<a name="61" /><span class="True">      61:</span> <span class="k">/**</span>
<a name="62" /><span class="True">      62:</span> <span class="k"> * access_ok: - Checks if a user space pointer is valid</span>
<a name="63" /><span class="True">      63:</span> <span class="k"> * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE.  Note that</span>
<a name="64" /><span class="True">      64:</span> <span class="k"> *        %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe</span>
<a name="65" /><span class="True">      65:</span> <span class="k"> *        to write to a block, it is always safe to read from it.</span>
<a name="66" /><span class="True">      66:</span> <span class="k"> * @addr: User space pointer to start of block to check</span>
<a name="67" /><span class="True">      67:</span> <span class="k"> * @size: Size of block to check</span>
<a name="68" /><span class="True">      68:</span> <span class="k"> *</span>
<a name="69" /><span class="True">      69:</span> <span class="k"> * Context: User context only.  This function may sleep.</span>
<a name="70" /><span class="True">      70:</span> <span class="k"> *</span>
<a name="71" /><span class="True">      71:</span> <span class="k"> * Checks if a pointer to a block of memory in user space is valid.</span>
<a name="72" /><span class="True">      72:</span> <span class="k"> *</span>
<a name="73" /><span class="True">      73:</span> <span class="k"> * Returns true (nonzero) if the memory block may be valid, false (zero)</span>
<a name="74" /><span class="True">      74:</span> <span class="k"> * if it is definitely invalid.</span>
<a name="75" /><span class="True">      75:</span> <span class="k"> *</span>
<a name="76" /><span class="True">      76:</span> <span class="k"> * Note that, depending on architecture, this function probably just</span>
<a name="77" /><span class="True">      77:</span> <span class="k"> * checks that the pointer is in the user space range - after calling</span>
<a name="78" /><span class="True">      78:</span> <span class="k"> * this function, memory access functions may still return -EFAULT.</span>
<a name="79" /><span class="True">      79:</span> <span class="k"> */</span>
<a name="80" /><span class="True">      80:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_YWNjZXNzX29rXzA_"><span class="b">access_ok</span></a><span class="f">(</span><span class="b">type</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span> \
<a name="81" /><span class="True">      81:</span>     <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><a href="cpu.c_macros_noref.html#_X19yYW5nZV9ub3Rfb2tfMA__"><span class="b">__range_not_ok</span></a><span class="f">(</span><span class="b">addr</span><span class="f">,</span> <span class="b">size</span><span class="f">,</span> <a href="cpu.c_macros_noref.html#_dXNlcl9hZGRyX21heF8w"><span class="b">user_addr_max</span></a><span class="f">(</span><span class="f">)</span><span class="f">)</span> <span class="f">==</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span>
<a name="82" /><span class="True">      82:</span> 
<a name="83" /><span class="True">      83:</span> <span class="k">/*</span>
<a name="84" /><span class="True">      84:</span> <span class="k"> * The exception table consists of pairs of addresses relative to the</span>
<a name="85" /><span class="True">      85:</span> <span class="k"> * exception table enty itself: the first is the address of an</span>
<a name="86" /><span class="True">      86:</span> <span class="k"> * instruction that is allowed to fault, and the second is the address</span>
<a name="87" /><span class="True">      87:</span> <span class="k"> * at which the program should continue.  No registers are modified,</span>
<a name="88" /><span class="True">      88:</span> <span class="k"> * so it is entirely up to the continuation code to figure out what to</span>
<a name="89" /><span class="True">      89:</span> <span class="k"> * do.</span>
<a name="90" /><span class="True">      90:</span> <span class="k"> *</span>
<a name="91" /><span class="True">      91:</span> <span class="k"> * All the routines below use bits of fixup code that are out of line</span>
<a name="92" /><span class="True">      92:</span> <span class="k"> * with the main instruction path.  This means when everything is well,</span>
<a name="93" /><span class="True">      93:</span> <span class="k"> * we don&apos;t even have to jump over them.  Further, they do not intrude</span>
<a name="94" /><span class="True">      94:</span> <span class="k"> * on our cache or tlb entries.</span>
<a name="95" /><span class="True">      95:</span> <span class="k"> */</span>
<a name="96" /><span class="True">      96:</span> 
<a name="97" /><span class="True">      97:</span> <span class="m">struct</span> <span class="b">exception_table_entry</span> <span class="f">{</span>
<a name="98" /><span class="True">      98:</span>     <span class="m">int</span> <span class="b">insn</span><span class="f">,</span> <span class="b">fixup</span><span class="f">;</span>
<a name="99" /><span class="True">      99:</span> <span class="f">}</span><span class="f">;</span>
<a name="100" /><span class="True">     100:</span> <span class="k">/* This is not the generic standard exception_table_entry format */</span>
<a name="101" /><span class="True">     101:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9IQVNfU09SVF9FWFRBQkxFXzA_"><span class="b">ARCH_HAS_SORT_EXTABLE</span></a>
<a name="102" /><span class="True">     102:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9IQVNfU0VBUkNIX0VYVEFCTEVfMA__"><span class="b">ARCH_HAS_SEARCH_EXTABLE</span></a>
<a name="103" /><span class="True">     103:</span> 
<a name="104" /><span class="True">     104:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">fixup_exception</span><span class="f">(</span><span class="m">struct</span> <span class="b">pt_regs</span> <span class="f">*</span><span class="b">regs</span><span class="f">)</span><span class="f">;</span>
<a name="105" /><span class="True">     105:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">early_fixup_exception</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">ip</span><span class="f">)</span><span class="f">;</span>
<a name="106" /><span class="True">     106:</span> 
<a name="107" /><span class="True">     107:</span> <span class="k">/*</span>
<a name="108" /><span class="True">     108:</span> <span class="k"> * These are the main single-value transfer routines.  They automatically</span>
<a name="109" /><span class="True">     109:</span> <span class="k"> * use the right size if we just have the right pointer type.</span>
<a name="110" /><span class="True">     110:</span> <span class="k"> *</span>
<a name="111" /><span class="True">     111:</span> <span class="k"> * This gets kind of ugly. We want to return _two_ values in &quot;get_user()&quot;</span>
<a name="112" /><span class="True">     112:</span> <span class="k"> * and yet we don&apos;t want to do any pointers, because that is too much</span>
<a name="113" /><span class="True">     113:</span> <span class="k"> * of a performance impact. Thus we have a few rather ugly macros here,</span>
<a name="114" /><span class="True">     114:</span> <span class="k"> * and hide all the ugliness from the user.</span>
<a name="115" /><span class="True">     115:</span> <span class="k"> *</span>
<a name="116" /><span class="True">     116:</span> <span class="k"> * The &quot;__xxx&quot; versions of the user access functions are versions that</span>
<a name="117" /><span class="True">     117:</span> <span class="k"> * do not verify the address space, that must have been done previously</span>
<a name="118" /><span class="True">     118:</span> <span class="k"> * with a separate &quot;access_ok()&quot; call (this is used when we do multiple</span>
<a name="119" /><span class="True">     119:</span> <span class="k"> * accesses to the same area of user memory).</span>
<a name="120" /><span class="True">     120:</span> <span class="k"> */</span>
<a name="121" /><span class="True">     121:</span> 
<a name="122" /><span class="True">     122:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__get_user_1</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="123" /><span class="True">     123:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__get_user_2</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="124" /><span class="True">     124:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__get_user_4</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="125" /><span class="True">     125:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__get_user_8</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="126" /><span class="True">     126:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__get_user_bad</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="127" /><span class="True">     127:</span> 
<a name="128" /><span class="True">     128:</span> <span class="k">/*</span>
<a name="129" /><span class="True">     129:</span> <span class="k"> * This is a type: either unsigned long, if the argument fits into</span>
<a name="130" /><span class="True">     130:</span> <span class="k"> * that type, or otherwise unsigned long long.</span>
<a name="131" /><span class="True">     131:</span> <span class="k"> */</span>
<a name="132" /><span class="True">     132:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19pbnR0eXBlXzA_"><span class="b">__inttype</span></a><span class="f">(</span><span class="b">x</span><span class="f">)</span> \
<a name="133" /><span class="True">     133:</span> <span class="b">__typeof__</span><span class="f">(</span><span class="b">__builtin_choose_expr</span><span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">&gt;</span> <span class="m">sizeof</span><span class="f">(</span><span class="c">0UL</span><span class="f">)</span><span class="f">,</span> <span class="c">0ULL</span><span class="f">,</span> <span class="c">0UL</span><span class="f">)</span><span class="f">)</span>
<a name="134" /><span class="True">     134:</span> 
<a name="135" /><span class="True">     135:</span> <span class="k">/**</span>
<a name="136" /><span class="True">     136:</span> <span class="k"> * get_user: - Get a simple variable from user space.</span>
<a name="137" /><span class="True">     137:</span> <span class="k"> * @x:   Variable to store result.</span>
<a name="138" /><span class="True">     138:</span> <span class="k"> * @ptr: Source address, in user space.</span>
<a name="139" /><span class="True">     139:</span> <span class="k"> *</span>
<a name="140" /><span class="True">     140:</span> <span class="k"> * Context: User context only.  This function may sleep.</span>
<a name="141" /><span class="True">     141:</span> <span class="k"> *</span>
<a name="142" /><span class="True">     142:</span> <span class="k"> * This macro copies a single simple variable from user space to kernel</span>
<a name="143" /><span class="True">     143:</span> <span class="k"> * space.  It supports simple types like char and int, but not larger</span>
<a name="144" /><span class="True">     144:</span> <span class="k"> * data types like structures or arrays.</span>
<a name="145" /><span class="True">     145:</span> <span class="k"> *</span>
<a name="146" /><span class="True">     146:</span> <span class="k"> * @ptr must have pointer-to-simple-variable type, and the result of</span>
<a name="147" /><span class="True">     147:</span> <span class="k"> * dereferencing @ptr must be assignable to @x without a cast.</span>
<a name="148" /><span class="True">     148:</span> <span class="k"> *</span>
<a name="149" /><span class="True">     149:</span> <span class="k"> * Returns zero on success, or -EFAULT on error.</span>
<a name="150" /><span class="True">     150:</span> <span class="k"> * On error, the variable @x is set to zero.</span>
<a name="151" /><span class="True">     151:</span> <span class="k"> */</span>
<a name="152" /><span class="True">     152:</span> <span class="k">/*</span>
<a name="153" /><span class="True">     153:</span> <span class="k"> * Careful: we have to cast the result to the type of the pointer</span>
<a name="154" /><span class="True">     154:</span> <span class="k"> * for sign reasons.</span>
<a name="155" /><span class="True">     155:</span> <span class="k"> *</span>
<a name="156" /><span class="True">     156:</span> <span class="k"> * The use of _ASM_DX as the register specifier is a bit of a</span>
<a name="157" /><span class="True">     157:</span> <span class="k"> * simplification, as gcc only cares about it as the starting point</span>
<a name="158" /><span class="True">     158:</span> <span class="k"> * and not size: for a 64-bit value it will use %ecx:%edx on 32 bits</span>
<a name="159" /><span class="True">     159:</span> <span class="k"> * (%ecx being the next register in gcc&apos;s x86 register sequence), and</span>
<a name="160" /><span class="True">     160:</span> <span class="k"> * %rdx on 64 bits.</span>
<a name="161" /><span class="True">     161:</span> <span class="k"> *</span>
<a name="162" /><span class="True">     162:</span> <span class="k"> * Clang/LLVM cares about the size of the register, but still wants</span>
<a name="163" /><span class="True">     163:</span> <span class="k"> * the base register for something that ends up being a pair.</span>
<a name="164" /><span class="True">     164:</span> <span class="k"> */</span>
<a name="165" /><span class="True">     165:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Z2V0X3VzZXJfMA__"><span class="b">get_user</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>                        \
<a name="166" /><span class="True">     166:</span> <span class="f">(</span><span class="f">{</span>                                    \
<a name="167" /><span class="True">     167:</span>     <span class="m">int</span> <span class="b">__ret_gu</span><span class="f">;</span>                            \
<a name="168" /><span class="True">     168:</span>     <span class="m">register</span> <a href="cpu.c_macros_noref.html#_X19pbnR0eXBlXzA_"><span class="b">__inttype</span></a><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__val_gu</span> <span class="m">asm</span><span class="f">(</span><span class="e">&quot;%&quot;</span><a href="cpu.c_macros_noref.html#_X0FTTV9EWF8w"><span class="b">_ASM_DX</span></a><span class="f">)</span><span class="f">;</span>        \
<a name="169" /><span class="True">     169:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                        \
<a name="170" /><span class="True">     170:</span>     <span class="b">might_fault</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                            \
<a name="171" /><span class="True">     171:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;call __get_user_%P3&quot;</span>                \
<a name="172" /><span class="True">     172:</span>              <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret_gu</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span> <span class="f">(</span><span class="b">__val_gu</span><span class="f">)</span>            \
<a name="173" /><span class="True">     173:</span>              <span class="f">:</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>        \
<a name="174" /><span class="True">     174:</span>     <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="f">(</span><span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="b">__val_gu</span><span class="f">;</span>                \
<a name="175" /><span class="True">     175:</span>     <span class="b">__ret_gu</span><span class="f">;</span>                            \
<a name="176" /><span class="True">     176:</span> <span class="f">}</span><span class="f">)</span>
<a name="177" /><span class="True">     177:</span> 
<a name="178" /><span class="True">     178:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94XzA_"><span class="b">__put_user_x</span></a><span class="f">(</span><span class="b">size</span><span class="f">,</span> <span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span>            \
<a name="179" /><span class="True">     179:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;call __put_user_&quot;</span> <span class="f">#</span><span class="b">size</span> <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret_pu</span><span class="f">)</span>    \
<a name="180" /><span class="True">     180:</span>              <span class="f">:</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="f">(</span><span class="b">typeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;c&quot;</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;ebx&quot;</span><span class="f">)</span>
<a name="181" /><span class="True">     181:</span> 
<a name="182" /><span class="True">     182:</span> 
<a name="183" /><span class="True">     183:</span> 
<a name="184" /><span class="False">     184:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="185" /><span class="False">     185:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fdTY0XzA_"><span class="b">__put_user_asm_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">err</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>            \
<a name="186" /><span class="False">     186:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_QVNNX1NUQUNfMA__"><span class="b">ASM_STAC</span></a> <span class="e">&quot;\n&quot;</span>                    \
<a name="187" /><span class="False">     187:</span>              <span class="e">&quot;1:	movl %%eax,0(%2)\n&quot;</span>            \
<a name="188" /><span class="False">     188:</span>              <span class="e">&quot;2:	movl %%edx,4(%2)\n&quot;</span>            \
<a name="189" /><span class="False">     189:</span>              <span class="e">&quot;3: &quot;</span> <a href="cpu.c_macros_ref.html#_QVNNX0NMQUNfMA__"><span class="b">ASM_CLAC</span></a> <span class="e">&quot;\n&quot;</span>                \
<a name="190" /><span class="False">     190:</span>              <span class="e">&quot;.section .fixup,\&quot;ax\&quot;\n&quot;</span>                \
<a name="191" /><span class="False">     191:</span>              <span class="e">&quot;4:	movl %3,%0\n&quot;</span>                \
<a name="192" /><span class="False">     192:</span>              <span class="e">&quot;	jmp 3b\n&quot;</span>                    \
<a name="193" /><span class="False">     193:</span>              <span class="e">&quot;.previous\n&quot;</span>                    \
<a name="194" /><span class="False">     194:</span>              <a href="cpu.c_macros_ref.html#_X0FTTV9FWFRBQkxFXzA_"><span class="b">_ASM_EXTABLE</span></a><span class="f">(</span><span class="c">1b</span><span class="f">,</span> <span class="c">4b</span><span class="f">)</span>                \
<a name="195" /><span class="False">     195:</span>              <a href="cpu.c_macros_ref.html#_X0FTTV9FWFRBQkxFXzA_"><span class="b">_ASM_EXTABLE</span></a><span class="f">(</span><span class="c">2b</span><span class="f">,</span> <span class="c">4b</span><span class="f">)</span>                \
<a name="196" /><span class="False">     196:</span>              <span class="f">:</span> <span class="e">&quot;=r&quot;</span> <span class="f">(</span><span class="b">err</span><span class="f">)</span>                    \
<a name="197" /><span class="False">     197:</span>              <span class="f">:</span> <span class="e">&quot;A&quot;</span> <span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">errret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">err</span><span class="f">)</span><span class="f">)</span>
<a name="198" /><span class="False">     198:</span> 
<a name="199" /><span class="False">     199:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfdTY0XzA_"><span class="b">__put_user_asm_ex_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span>                    \
<a name="200" /><span class="False">     200:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_QVNNX1NUQUNfMA__"><span class="b">ASM_STAC</span></a> <span class="e">&quot;\n&quot;</span>                    \
<a name="201" /><span class="False">     201:</span>              <span class="e">&quot;1:	movl %%eax,0(%1)\n&quot;</span>            \
<a name="202" /><span class="False">     202:</span>              <span class="e">&quot;2:	movl %%edx,4(%1)\n&quot;</span>            \
<a name="203" /><span class="False">     203:</span>              <span class="e">&quot;3: &quot;</span> <a href="cpu.c_macros_ref.html#_QVNNX0NMQUNfMA__"><span class="b">ASM_CLAC</span></a> <span class="e">&quot;\n&quot;</span>                \
<a name="204" /><span class="False">     204:</span>              <a href="cpu.c_macros_noref.html#_X0FTTV9FWFRBQkxFX0VYXzA_"><span class="b">_ASM_EXTABLE_EX</span></a><span class="f">(</span><span class="c">1b</span><span class="f">,</span> <span class="c">2b</span><span class="f">)</span>                \
<a name="205" /><span class="False">     205:</span>              <a href="cpu.c_macros_noref.html#_X0FTTV9FWFRBQkxFX0VYXzA_"><span class="b">_ASM_EXTABLE_EX</span></a><span class="f">(</span><span class="c">2b</span><span class="f">,</span> <span class="c">3b</span><span class="f">)</span>                \
<a name="206" /><span class="False">     206:</span>              <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;A&quot;</span> <span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">)</span>
<a name="207" /><span class="False">     207:</span> 
<a name="208" /><span class="False">     208:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94OF8w"><span class="b">__put_user_x8</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span>                \
<a name="209" /><span class="False">     209:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;call __put_user_8&quot;</span> <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret_pu</span><span class="f">)</span>    \
<a name="210" /><span class="False">     210:</span>              <span class="f">:</span> <span class="e">&quot;A&quot;</span> <span class="f">(</span><span class="f">(</span><span class="b">typeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;c&quot;</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;ebx&quot;</span><span class="f">)</span>
<a name="211" /><span class="True">     211:</span> <span class="f">#</span><span class="n">else</span>
<a name="212" /><span class="True">     212:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fdTY0XzA_"><span class="b">__put_user_asm_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span> \
<a name="213" /><span class="True">     213:</span>     <a href="cpu.c_macros_ref.html#_X19wdXRfdXNlcl9hc21fMA__"><span class="b">__put_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;q&quot;</span><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">,</span> <span class="e">&quot;er&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>
<a name="214" /><span class="True">     214:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfdTY0XzA_"><span class="b">__put_user_asm_ex_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">)</span>    \
<a name="215" /><span class="True">     215:</span>     <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfMA__"><span class="b">__put_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="e">&quot;q&quot;</span><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">,</span> <span class="e">&quot;er&quot;</span><span class="f">)</span>
<a name="216" /><span class="True">     216:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94OF8w"><span class="b">__put_user_x8</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94XzA_"><span class="b">__put_user_x</span></a><span class="f">(</span><span class="c">8</span><span class="f">,</span> <span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span>
<a name="217" /><span class="True">     217:</span> <span class="f">#</span><span class="n">endif</span>
<a name="218" /><span class="True">     218:</span> 
<a name="219" /><span class="True">     219:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__put_user_bad</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="220" /><span class="True">     220:</span> 
<a name="221" /><span class="True">     221:</span> <span class="k">/*</span>
<a name="222" /><span class="True">     222:</span> <span class="k"> * Strange magic calling convention: pointer in %ecx,</span>
<a name="223" /><span class="True">     223:</span> <span class="k"> * value in %eax(:%edx), return value in %eax. clobbers %rbx</span>
<a name="224" /><span class="True">     224:</span> <span class="k"> */</span>
<a name="225" /><span class="True">     225:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__put_user_1</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="226" /><span class="True">     226:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__put_user_2</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="227" /><span class="True">     227:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__put_user_4</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="228" /><span class="True">     228:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__put_user_8</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="229" /><span class="True">     229:</span> 
<a name="230" /><span class="True">     230:</span> <span class="k">/**</span>
<a name="231" /><span class="True">     231:</span> <span class="k"> * put_user: - Write a simple value into user space.</span>
<a name="232" /><span class="True">     232:</span> <span class="k"> * @x:   Value to copy to user space.</span>
<a name="233" /><span class="True">     233:</span> <span class="k"> * @ptr: Destination address, in user space.</span>
<a name="234" /><span class="True">     234:</span> <span class="k"> *</span>
<a name="235" /><span class="True">     235:</span> <span class="k"> * Context: User context only.  This function may sleep.</span>
<a name="236" /><span class="True">     236:</span> <span class="k"> *</span>
<a name="237" /><span class="True">     237:</span> <span class="k"> * This macro copies a single simple value from kernel space to user</span>
<a name="238" /><span class="True">     238:</span> <span class="k"> * space.  It supports simple types like char and int, but not larger</span>
<a name="239" /><span class="True">     239:</span> <span class="k"> * data types like structures or arrays.</span>
<a name="240" /><span class="True">     240:</span> <span class="k"> *</span>
<a name="241" /><span class="True">     241:</span> <span class="k"> * @ptr must have pointer-to-simple-variable type, and @x must be assignable</span>
<a name="242" /><span class="True">     242:</span> <span class="k"> * to the result of dereferencing @ptr.</span>
<a name="243" /><span class="True">     243:</span> <span class="k"> *</span>
<a name="244" /><span class="True">     244:</span> <span class="k"> * Returns zero on success, or -EFAULT on error.</span>
<a name="245" /><span class="True">     245:</span> <span class="k"> */</span>
<a name="246" /><span class="True">     246:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cHV0X3VzZXJfMA__"><span class="b">put_user</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>                    \
<a name="247" /><span class="True">     247:</span> <span class="f">(</span><span class="f">{</span>                                \
<a name="248" /><span class="True">     248:</span>     <span class="m">int</span> <span class="b">__ret_pu</span><span class="f">;</span>                        \
<a name="249" /><span class="True">     249:</span>     <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__pu_val</span><span class="f">;</span>                \
<a name="250" /><span class="True">     250:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                    \
<a name="251" /><span class="True">     251:</span>     <span class="b">might_fault</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                        \
<a name="252" /><span class="True">     252:</span>     <span class="b">__pu_val</span> <span class="f">=</span> <span class="b">x</span><span class="f">;</span>                        \
<a name="253" /><span class="True">     253:</span>     <span class="m">switch</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>                \
<a name="254" /><span class="True">     254:</span>     <span class="m">case</span> <span class="c">1</span><span class="f">:</span>                            \
<a name="255" /><span class="True">     255:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94XzA_"><span class="b">__put_user_x</span></a><span class="f">(</span><span class="c">1</span><span class="f">,</span> <span class="b">__pu_val</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span><span class="f">;</span>    \
<a name="256" /><span class="True">     256:</span>         <span class="m">break</span><span class="f">;</span>                        \
<a name="257" /><span class="True">     257:</span>     <span class="m">case</span> <span class="c">2</span><span class="f">:</span>                            \
<a name="258" /><span class="True">     258:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94XzA_"><span class="b">__put_user_x</span></a><span class="f">(</span><span class="c">2</span><span class="f">,</span> <span class="b">__pu_val</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span><span class="f">;</span>    \
<a name="259" /><span class="True">     259:</span>         <span class="m">break</span><span class="f">;</span>                        \
<a name="260" /><span class="True">     260:</span>     <span class="m">case</span> <span class="c">4</span><span class="f">:</span>                            \
<a name="261" /><span class="True">     261:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94XzA_"><span class="b">__put_user_x</span></a><span class="f">(</span><span class="c">4</span><span class="f">,</span> <span class="b">__pu_val</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span><span class="f">;</span>    \
<a name="262" /><span class="True">     262:</span>         <span class="m">break</span><span class="f">;</span>                        \
<a name="263" /><span class="True">     263:</span>     <span class="m">case</span> <span class="c">8</span><span class="f">:</span>                            \
<a name="264" /><span class="True">     264:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94OF8w"><span class="b">__put_user_x8</span></a><span class="f">(</span><span class="b">__pu_val</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span><span class="f">;</span>        \
<a name="265" /><span class="True">     265:</span>         <span class="m">break</span><span class="f">;</span>                        \
<a name="266" /><span class="True">     266:</span>     <span class="m">default</span><span class="f">:</span>                        \
<a name="267" /><span class="True">     267:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl94XzA_"><span class="b">__put_user_x</span></a><span class="f">(</span><span class="b">X</span><span class="f">,</span> <span class="b">__pu_val</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">__ret_pu</span><span class="f">)</span><span class="f">;</span>    \
<a name="268" /><span class="True">     268:</span>         <span class="m">break</span><span class="f">;</span>                        \
<a name="269" /><span class="True">     269:</span>     <span class="f">}</span>                            \
<a name="270" /><span class="True">     270:</span>     <span class="b">__ret_pu</span><span class="f">;</span>                        \
<a name="271" /><span class="True">     271:</span> <span class="f">}</span><span class="f">)</span>
<a name="272" /><span class="True">     272:</span> 
<a name="273" /><span class="True">     273:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9zaXplXzA_"><span class="b">__put_user_size</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">size</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>            \
<a name="274" /><span class="True">     274:</span> <span class="m">do</span> <span class="f">{</span>                                    \
<a name="275" /><span class="True">     275:</span>     <span class="b">retval</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>                            \
<a name="276" /><span class="True">     276:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                        \
<a name="277" /><span class="True">     277:</span>     <span class="m">switch</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span> <span class="f">{</span>                            \
<a name="278" /><span class="True">     278:</span>     <span class="m">case</span> <span class="c">1</span><span class="f">:</span>                                \
<a name="279" /><span class="True">     279:</span>         <a href="cpu.c_macros_ref.html#_X19wdXRfdXNlcl9hc21fMA__"><span class="b">__put_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;iq&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>    \
<a name="280" /><span class="True">     280:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="281" /><span class="True">     281:</span>     <span class="m">case</span> <span class="c">2</span><span class="f">:</span>                                \
<a name="282" /><span class="True">     282:</span>         <a href="cpu.c_macros_ref.html#_X19wdXRfdXNlcl9hc21fMA__"><span class="b">__put_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;ir&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>    \
<a name="283" /><span class="True">     283:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="284" /><span class="True">     284:</span>     <span class="m">case</span> <span class="c">4</span><span class="f">:</span>                                \
<a name="285" /><span class="True">     285:</span>         <a href="cpu.c_macros_ref.html#_X19wdXRfdXNlcl9hc21fMA__"><span class="b">__put_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;l&quot;</span><span class="f">,</span> <span class="e">&quot;k&quot;</span><span class="f">,</span> <span class="e">&quot;ir&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>    \
<a name="286" /><span class="True">     286:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="287" /><span class="True">     287:</span>     <span class="m">case</span> <span class="c">8</span><span class="f">:</span>                                \
<a name="288" /><span class="True">     288:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fdTY0XzA_"><span class="b">__put_user_asm_u64</span></a><span class="f">(</span><span class="f">(</span><span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span>    \
<a name="289" /><span class="True">     289:</span>                    <span class="b">errret</span><span class="f">)</span><span class="f">;</span>                \
<a name="290" /><span class="True">     290:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="291" /><span class="True">     291:</span>     <span class="m">default</span><span class="f">:</span>                            \
<a name="292" /><span class="True">     292:</span>         <span class="b">__put_user_bad</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                    \
<a name="293" /><span class="True">     293:</span>     <span class="f">}</span>                                \
<a name="294" /><span class="True">     294:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="295" /><span class="True">     295:</span> 
<a name="296" /><span class="True">     296:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9zaXplX2V4XzA_"><span class="b">__put_user_size_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>                \
<a name="297" /><span class="True">     297:</span> <span class="m">do</span> <span class="f">{</span>                                    \
<a name="298" /><span class="True">     298:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                        \
<a name="299" /><span class="True">     299:</span>     <span class="m">switch</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span> <span class="f">{</span>                            \
<a name="300" /><span class="True">     300:</span>     <span class="m">case</span> <span class="c">1</span><span class="f">:</span>                                \
<a name="301" /><span class="True">     301:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfMA__"><span class="b">__put_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;iq&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="302" /><span class="True">     302:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="303" /><span class="True">     303:</span>     <span class="m">case</span> <span class="c">2</span><span class="f">:</span>                                \
<a name="304" /><span class="True">     304:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfMA__"><span class="b">__put_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;ir&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="305" /><span class="True">     305:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="306" /><span class="True">     306:</span>     <span class="m">case</span> <span class="c">4</span><span class="f">:</span>                                \
<a name="307" /><span class="True">     307:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfMA__"><span class="b">__put_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;l&quot;</span><span class="f">,</span> <span class="e">&quot;k&quot;</span><span class="f">,</span> <span class="e">&quot;ir&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="308" /><span class="True">     308:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="309" /><span class="True">     309:</span>     <span class="m">case</span> <span class="c">8</span><span class="f">:</span>                                \
<a name="310" /><span class="True">     310:</span>         <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfdTY0XzA_"><span class="b">__put_user_asm_ex_u64</span></a><span class="f">(</span><span class="f">(</span><span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span><span class="f">;</span>    \
<a name="311" /><span class="True">     311:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="312" /><span class="True">     312:</span>     <span class="m">default</span><span class="f">:</span>                            \
<a name="313" /><span class="True">     313:</span>         <span class="b">__put_user_bad</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                    \
<a name="314" /><span class="True">     314:</span>     <span class="f">}</span>                                \
<a name="315" /><span class="True">     315:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="316" /><span class="True">     316:</span> 
<a name="317" /><span class="False">     317:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="318" /><span class="False">     318:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fdTY0XzA_"><span class="b">__get_user_asm_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>    <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="b">__get_user_bad</span><span class="f">(</span><span class="f">)</span>
<a name="319" /><span class="False">     319:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfdTY0XzA_"><span class="b">__get_user_asm_ex_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>            <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="b">__get_user_bad</span><span class="f">(</span><span class="f">)</span>
<a name="320" /><span class="True">     320:</span> <span class="f">#</span><span class="n">else</span>
<a name="321" /><span class="True">     321:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fdTY0XzA_"><span class="b">__get_user_asm_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span> \
<a name="322" /><span class="True">     322:</span>      <a href="cpu.c_macros_ref.html#_X19nZXRfdXNlcl9hc21fMA__"><span class="b">__get_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;q&quot;</span><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>
<a name="323" /><span class="True">     323:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfdTY0XzA_"><span class="b">__get_user_asm_ex_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span> \
<a name="324" /><span class="True">     324:</span>      <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfMA__"><span class="b">__get_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;q&quot;</span><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span><span class="f">)</span>
<a name="325" /><span class="True">     325:</span> <span class="f">#</span><span class="n">endif</span>
<a name="326" /><span class="True">     326:</span> 
<a name="327" /><span class="True">     327:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9zaXplXzA_"><span class="b">__get_user_size</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">size</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>            \
<a name="328" /><span class="True">     328:</span> <span class="m">do</span> <span class="f">{</span>                                    \
<a name="329" /><span class="True">     329:</span>     <span class="b">retval</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>                            \
<a name="330" /><span class="True">     330:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                        \
<a name="331" /><span class="True">     331:</span>     <span class="m">switch</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span> <span class="f">{</span>                            \
<a name="332" /><span class="True">     332:</span>     <span class="m">case</span> <span class="c">1</span><span class="f">:</span>                                \
<a name="333" /><span class="True">     333:</span>         <a href="cpu.c_macros_ref.html#_X19nZXRfdXNlcl9hc21fMA__"><span class="b">__get_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;=q&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>    \
<a name="334" /><span class="True">     334:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="335" /><span class="True">     335:</span>     <span class="m">case</span> <span class="c">2</span><span class="f">:</span>                                \
<a name="336" /><span class="True">     336:</span>         <a href="cpu.c_macros_ref.html#_X19nZXRfdXNlcl9hc21fMA__"><span class="b">__get_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>    \
<a name="337" /><span class="True">     337:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="338" /><span class="True">     338:</span>     <span class="m">case</span> <span class="c">4</span><span class="f">:</span>                                \
<a name="339" /><span class="True">     339:</span>         <a href="cpu.c_macros_ref.html#_X19nZXRfdXNlcl9hc21fMA__"><span class="b">__get_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="e">&quot;l&quot;</span><span class="f">,</span> <span class="e">&quot;k&quot;</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>    \
<a name="340" /><span class="True">     340:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="341" /><span class="True">     341:</span>     <span class="m">case</span> <span class="c">8</span><span class="f">:</span>                                \
<a name="342" /><span class="True">     342:</span>         <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fdTY0XzA_"><span class="b">__get_user_asm_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">retval</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span><span class="f">;</span>        \
<a name="343" /><span class="True">     343:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="344" /><span class="True">     344:</span>     <span class="m">default</span><span class="f">:</span>                            \
<a name="345" /><span class="True">     345:</span>         <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="b">__get_user_bad</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                    \
<a name="346" /><span class="True">     346:</span>     <span class="f">}</span>                                \
<a name="347" /><span class="True">     347:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="348" /><span class="True">     348:</span> 
<a name="349" /><span class="True">     349:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19nZXRfdXNlcl9hc21fMA__"><span class="b">__get_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">err</span><span class="f">,</span> <span class="b">itype</span><span class="f">,</span> <span class="b">rtype</span><span class="f">,</span> <span class="b">ltype</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>    \
<a name="350" /><span class="True">     350:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_QVNNX1NUQUNfMA__"><span class="b">ASM_STAC</span></a> <span class="e">&quot;\n&quot;</span>                    \
<a name="351" /><span class="True">     351:</span>              <span class="e">&quot;1:	mov&quot;</span><span class="b">itype</span><span class="e">&quot; %2,%&quot;</span><span class="b">rtype</span><span class="e">&quot;1\n&quot;</span>        \
<a name="352" /><span class="True">     352:</span>              <span class="e">&quot;2: &quot;</span> <a href="cpu.c_macros_ref.html#_QVNNX0NMQUNfMA__"><span class="b">ASM_CLAC</span></a> <span class="e">&quot;\n&quot;</span>                \
<a name="353" /><span class="True">     353:</span>              <span class="e">&quot;.section .fixup,\&quot;ax\&quot;\n&quot;</span>                \
<a name="354" /><span class="True">     354:</span>              <span class="e">&quot;3:	mov %3,%0\n&quot;</span>                \
<a name="355" /><span class="True">     355:</span>              <span class="e">&quot;	xor&quot;</span><span class="b">itype</span><span class="e">&quot; %&quot;</span><span class="b">rtype</span><span class="e">&quot;1,%&quot;</span><span class="b">rtype</span><span class="e">&quot;1\n&quot;</span>        \
<a name="356" /><span class="True">     356:</span>              <span class="e">&quot;	jmp 2b\n&quot;</span>                    \
<a name="357" /><span class="True">     357:</span>              <span class="e">&quot;.previous\n&quot;</span>                    \
<a name="358" /><span class="True">     358:</span>              <a href="cpu.c_macros_ref.html#_X0FTTV9FWFRBQkxFXzA_"><span class="b">_ASM_EXTABLE</span></a><span class="f">(</span><span class="c">1b</span><span class="f">,</span> <span class="c">3b</span><span class="f">)</span>                \
<a name="359" /><span class="True">     359:</span>              <span class="f">:</span> <span class="e">&quot;=r&quot;</span> <span class="f">(</span><span class="b">err</span><span class="f">)</span><span class="f">,</span> <span class="b">ltype</span><span class="f">(</span><span class="b">x</span><span class="f">)</span>                \
<a name="360" /><span class="True">     360:</span>              <span class="f">:</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19tXzA_"><span class="b">__m</span></a><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">errret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">err</span><span class="f">)</span><span class="f">)</span>
<a name="361" /><span class="True">     361:</span> 
<a name="362" /><span class="True">     362:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9zaXplX2V4XzA_"><span class="b">__get_user_size_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>                \
<a name="363" /><span class="True">     363:</span> <span class="m">do</span> <span class="f">{</span>                                    \
<a name="364" /><span class="True">     364:</span>     <a href="cpu.c_macros_noref.html#_X19jaGtfdXNlcl9wdHJfMA__"><span class="b">__chk_user_ptr</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                        \
<a name="365" /><span class="True">     365:</span>     <span class="m">switch</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span> <span class="f">{</span>                            \
<a name="366" /><span class="True">     366:</span>     <span class="m">case</span> <span class="c">1</span><span class="f">:</span>                                \
<a name="367" /><span class="True">     367:</span>         <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfMA__"><span class="b">__get_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;b&quot;</span><span class="f">,</span> <span class="e">&quot;=q&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="368" /><span class="True">     368:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="369" /><span class="True">     369:</span>     <span class="m">case</span> <span class="c">2</span><span class="f">:</span>                                \
<a name="370" /><span class="True">     370:</span>         <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfMA__"><span class="b">__get_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;w&quot;</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="371" /><span class="True">     371:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="372" /><span class="True">     372:</span>     <span class="m">case</span> <span class="c">4</span><span class="f">:</span>                                \
<a name="373" /><span class="True">     373:</span>         <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfMA__"><span class="b">__get_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="e">&quot;l&quot;</span><span class="f">,</span> <span class="e">&quot;k&quot;</span><span class="f">,</span> <span class="e">&quot;=r&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="374" /><span class="True">     374:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="375" /><span class="True">     375:</span>     <span class="m">case</span> <span class="c">8</span><span class="f">:</span>                                \
<a name="376" /><span class="True">     376:</span>         <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfdTY0XzA_"><span class="b">__get_user_asm_ex_u64</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span><span class="f">;</span>                \
<a name="377" /><span class="True">     377:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="378" /><span class="True">     378:</span>     <span class="m">default</span><span class="f">:</span>                            \
<a name="379" /><span class="True">     379:</span>         <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="b">__get_user_bad</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                    \
<a name="380" /><span class="True">     380:</span>     <span class="f">}</span>                                \
<a name="381" /><span class="True">     381:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="382" /><span class="True">     382:</span> 
<a name="383" /><span class="True">     383:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9hc21fZXhfMA__"><span class="b">__get_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">itype</span><span class="f">,</span> <span class="b">rtype</span><span class="f">,</span> <span class="b">ltype</span><span class="f">)</span>            \
<a name="384" /><span class="True">     384:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;1:	mov&quot;</span><span class="b">itype</span><span class="e">&quot; %1,%&quot;</span><span class="b">rtype</span><span class="e">&quot;0\n&quot;</span>        \
<a name="385" /><span class="True">     385:</span>              <span class="e">&quot;2:\n&quot;</span>                        \
<a name="386" /><span class="True">     386:</span>              <a href="cpu.c_macros_noref.html#_X0FTTV9FWFRBQkxFX0VYXzA_"><span class="b">_ASM_EXTABLE_EX</span></a><span class="f">(</span><span class="c">1b</span><span class="f">,</span> <span class="c">2b</span><span class="f">)</span>                \
<a name="387" /><span class="True">     387:</span>              <span class="f">:</span> <span class="b">ltype</span><span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19tXzA_"><span class="b">__m</span></a><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="388" /><span class="True">     388:</span> 
<a name="389" /><span class="True">     389:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9ub2NoZWNrXzA_"><span class="b">__put_user_nocheck</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>            \
<a name="390" /><span class="True">     390:</span> <span class="f">(</span><span class="f">{</span>                                \
<a name="391" /><span class="True">     391:</span>     <span class="m">int</span> <span class="b">__pu_err</span><span class="f">;</span>                        \
<a name="392" /><span class="True">     392:</span>     <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9zaXplXzA_"><span class="b">__put_user_size</span></a><span class="f">(</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="b">__pu_err</span><span class="f">,</span> <span class="f">-</span><a href="cpu.c_macros_noref.html#_RUZBVUxUXzA_"><span class="b">EFAULT</span></a><span class="f">)</span><span class="f">;</span>    \
<a name="393" /><span class="True">     393:</span>     <span class="b">__pu_err</span><span class="f">;</span>                        \
<a name="394" /><span class="True">     394:</span> <span class="f">}</span><span class="f">)</span>
<a name="395" /><span class="True">     395:</span> 
<a name="396" /><span class="True">     396:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9ub2NoZWNrXzA_"><span class="b">__get_user_nocheck</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>                \
<a name="397" /><span class="True">     397:</span> <span class="f">(</span><span class="f">{</span>                                    \
<a name="398" /><span class="True">     398:</span>     <span class="m">int</span> <span class="b">__gu_err</span><span class="f">;</span>                            \
<a name="399" /><span class="True">     399:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__gu_val</span><span class="f">;</span>                        \
<a name="400" /><span class="True">     400:</span>     <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9zaXplXzA_"><span class="b">__get_user_size</span></a><span class="f">(</span><span class="b">__gu_val</span><span class="f">,</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="b">__gu_err</span><span class="f">,</span> <span class="f">-</span><a href="cpu.c_macros_noref.html#_RUZBVUxUXzA_"><span class="b">EFAULT</span></a><span class="f">)</span><span class="f">;</span>    \
<a name="401" /><span class="True">     401:</span>     <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="b">__gu_val</span><span class="f">;</span>            \
<a name="402" /><span class="True">     402:</span>     <span class="b">__gu_err</span><span class="f">;</span>                            \
<a name="403" /><span class="True">     403:</span> <span class="f">}</span><span class="f">)</span>
<a name="404" /><span class="True">     404:</span> 
<a name="405" /><span class="True">     405:</span> <span class="k">/* FIXME: this hack is definitely wrong -AK */</span>
<a name="406" /><span class="True">     406:</span> <span class="m">struct</span> <span class="b">__large_struct</span> <span class="f">{</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">buf</span><span class="f">[</span><span class="c">100</span><span class="f">]</span><span class="f">;</span> <span class="f">}</span><span class="f">;</span>
<a name="407" /><span class="True">     407:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19tXzA_"><span class="b">__m</span></a><span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="m">struct</span> <span class="b">__large_struct</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">)</span>
<a name="408" /><span class="True">     408:</span> 
<a name="409" /><span class="True">     409:</span> <span class="k">/*</span>
<a name="410" /><span class="True">     410:</span> <span class="k"> * Tell gcc we read from memory instead of writing: this is because</span>
<a name="411" /><span class="True">     411:</span> <span class="k"> * we do not write to any memory gcc knows about, so there are no</span>
<a name="412" /><span class="True">     412:</span> <span class="k"> * aliasing issues.</span>
<a name="413" /><span class="True">     413:</span> <span class="k"> */</span>
<a name="414" /><span class="True">     414:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19wdXRfdXNlcl9hc21fMA__"><span class="b">__put_user_asm</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">err</span><span class="f">,</span> <span class="b">itype</span><span class="f">,</span> <span class="b">rtype</span><span class="f">,</span> <span class="b">ltype</span><span class="f">,</span> <span class="b">errret</span><span class="f">)</span>    \
<a name="415" /><span class="True">     415:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_QVNNX1NUQUNfMA__"><span class="b">ASM_STAC</span></a> <span class="e">&quot;\n&quot;</span>                    \
<a name="416" /><span class="True">     416:</span>              <span class="e">&quot;1:	mov&quot;</span><span class="b">itype</span><span class="e">&quot; %&quot;</span><span class="b">rtype</span><span class="e">&quot;1,%2\n&quot;</span>        \
<a name="417" /><span class="True">     417:</span>              <span class="e">&quot;2: &quot;</span> <a href="cpu.c_macros_ref.html#_QVNNX0NMQUNfMA__"><span class="b">ASM_CLAC</span></a> <span class="e">&quot;\n&quot;</span>                \
<a name="418" /><span class="True">     418:</span>              <span class="e">&quot;.section .fixup,\&quot;ax\&quot;\n&quot;</span>                \
<a name="419" /><span class="True">     419:</span>              <span class="e">&quot;3:	mov %3,%0\n&quot;</span>                \
<a name="420" /><span class="True">     420:</span>              <span class="e">&quot;	jmp 2b\n&quot;</span>                    \
<a name="421" /><span class="True">     421:</span>              <span class="e">&quot;.previous\n&quot;</span>                    \
<a name="422" /><span class="True">     422:</span>              <a href="cpu.c_macros_ref.html#_X0FTTV9FWFRBQkxFXzA_"><span class="b">_ASM_EXTABLE</span></a><span class="f">(</span><span class="c">1b</span><span class="f">,</span> <span class="c">3b</span><span class="f">)</span>                \
<a name="423" /><span class="True">     423:</span>              <span class="f">:</span> <span class="e">&quot;=r&quot;</span><span class="f">(</span><span class="b">err</span><span class="f">)</span>                    \
<a name="424" /><span class="True">     424:</span>              <span class="f">:</span> <span class="b">ltype</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19tXzA_"><span class="b">__m</span></a><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="b">errret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">err</span><span class="f">)</span><span class="f">)</span>
<a name="425" /><span class="True">     425:</span> 
<a name="426" /><span class="True">     426:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9hc21fZXhfMA__"><span class="b">__put_user_asm_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">addr</span><span class="f">,</span> <span class="b">itype</span><span class="f">,</span> <span class="b">rtype</span><span class="f">,</span> <span class="b">ltype</span><span class="f">)</span>            \
<a name="427" /><span class="True">     427:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="e">&quot;1:	mov&quot;</span><span class="b">itype</span><span class="e">&quot; %&quot;</span><span class="b">rtype</span><span class="e">&quot;0,%1\n&quot;</span>        \
<a name="428" /><span class="True">     428:</span>              <span class="e">&quot;2:\n&quot;</span>                        \
<a name="429" /><span class="True">     429:</span>              <a href="cpu.c_macros_noref.html#_X0FTTV9FWFRBQkxFX0VYXzA_"><span class="b">_ASM_EXTABLE_EX</span></a><span class="f">(</span><span class="c">1b</span><span class="f">,</span> <span class="c">2b</span><span class="f">)</span>                \
<a name="430" /><span class="True">     430:</span>              <span class="f">:</span> <span class="f">:</span> <span class="b">ltype</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;m&quot;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19tXzA_"><span class="b">__m</span></a><span class="f">(</span><span class="b">addr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="431" /><span class="True">     431:</span> 
<a name="432" /><span class="True">     432:</span> <span class="k">/*</span>
<a name="433" /><span class="True">     433:</span> <span class="k"> * uaccess_try and catch</span>
<a name="434" /><span class="True">     434:</span> <span class="k"> */</span>
<a name="435" /><span class="True">     435:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dWFjY2Vzc190cnlfMA__"><span class="b">uaccess_try</span></a>    <span class="m">do</span> <span class="f">{</span>                        \
<a name="436" /><span class="True">     436:</span>     <span class="b">current_thread_info</span><span class="f">(</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">uaccess_err</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span>                \
<a name="437" /><span class="True">     437:</span>     <span class="b">stac</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                                \
<a name="438" /><span class="True">     438:</span>     <a href="cpu.c_macros_ref.html#_YmFycmllcl8w"><span class="b">barrier</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="439" /><span class="True">     439:</span> 
<a name="440" /><span class="True">     440:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_dWFjY2Vzc19jYXRjaF8w"><span class="b">uaccess_catch</span></a><span class="f">(</span><span class="b">err</span><span class="f">)</span>                        \
<a name="441" /><span class="True">     441:</span>     <span class="b">clac</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                                \
<a name="442" /><span class="True">     442:</span>     <span class="f">(</span><span class="b">err</span><span class="f">)</span> <span class="f">|=</span> <span class="f">(</span><span class="b">current_thread_info</span><span class="f">(</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">uaccess_err</span> <span class="f">?</span> <span class="f">-</span><a href="cpu.c_macros_noref.html#_RUZBVUxUXzA_"><span class="b">EFAULT</span></a> <span class="f">:</span> <span class="c">0</span><span class="f">)</span><span class="f">;</span>    \
<a name="443" /><span class="True">     443:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="444" /><span class="True">     444:</span> 
<a name="445" /><span class="True">     445:</span> <span class="k">/**</span>
<a name="446" /><span class="True">     446:</span> <span class="k"> * __get_user: - Get a simple variable from user space, with less checking.</span>
<a name="447" /><span class="True">     447:</span> <span class="k"> * @x:   Variable to store result.</span>
<a name="448" /><span class="True">     448:</span> <span class="k"> * @ptr: Source address, in user space.</span>
<a name="449" /><span class="True">     449:</span> <span class="k"> *</span>
<a name="450" /><span class="True">     450:</span> <span class="k"> * Context: User context only.  This function may sleep.</span>
<a name="451" /><span class="True">     451:</span> <span class="k"> *</span>
<a name="452" /><span class="True">     452:</span> <span class="k"> * This macro copies a single simple variable from user space to kernel</span>
<a name="453" /><span class="True">     453:</span> <span class="k"> * space.  It supports simple types like char and int, but not larger</span>
<a name="454" /><span class="True">     454:</span> <span class="k"> * data types like structures or arrays.</span>
<a name="455" /><span class="True">     455:</span> <span class="k"> *</span>
<a name="456" /><span class="True">     456:</span> <span class="k"> * @ptr must have pointer-to-simple-variable type, and the result of</span>
<a name="457" /><span class="True">     457:</span> <span class="k"> * dereferencing @ptr must be assignable to @x without a cast.</span>
<a name="458" /><span class="True">     458:</span> <span class="k"> *</span>
<a name="459" /><span class="True">     459:</span> <span class="k"> * Caller must check the pointer with access_ok() before calling this</span>
<a name="460" /><span class="True">     460:</span> <span class="k"> * function.</span>
<a name="461" /><span class="True">     461:</span> <span class="k"> *</span>
<a name="462" /><span class="True">     462:</span> <span class="k"> * Returns zero on success, or -EFAULT on error.</span>
<a name="463" /><span class="True">     463:</span> <span class="k"> * On error, the variable @x is set to zero.</span>
<a name="464" /><span class="True">     464:</span> <span class="k"> */</span>
<a name="465" /><span class="True">     465:</span> 
<a name="466" /><span class="True">     466:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl8w"><span class="b">__get_user</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>                        \
<a name="467" /><span class="True">     467:</span>     <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9ub2NoZWNrXzA_"><span class="b">__get_user_nocheck</span></a><span class="f">(</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="468" /><span class="True">     468:</span> 
<a name="469" /><span class="True">     469:</span> <span class="k">/**</span>
<a name="470" /><span class="True">     470:</span> <span class="k"> * __put_user: - Write a simple value into user space, with less checking.</span>
<a name="471" /><span class="True">     471:</span> <span class="k"> * @x:   Value to copy to user space.</span>
<a name="472" /><span class="True">     472:</span> <span class="k"> * @ptr: Destination address, in user space.</span>
<a name="473" /><span class="True">     473:</span> <span class="k"> *</span>
<a name="474" /><span class="True">     474:</span> <span class="k"> * Context: User context only.  This function may sleep.</span>
<a name="475" /><span class="True">     475:</span> <span class="k"> *</span>
<a name="476" /><span class="True">     476:</span> <span class="k"> * This macro copies a single simple value from kernel space to user</span>
<a name="477" /><span class="True">     477:</span> <span class="k"> * space.  It supports simple types like char and int, but not larger</span>
<a name="478" /><span class="True">     478:</span> <span class="k"> * data types like structures or arrays.</span>
<a name="479" /><span class="True">     479:</span> <span class="k"> *</span>
<a name="480" /><span class="True">     480:</span> <span class="k"> * @ptr must have pointer-to-simple-variable type, and @x must be assignable</span>
<a name="481" /><span class="True">     481:</span> <span class="k"> * to the result of dereferencing @ptr.</span>
<a name="482" /><span class="True">     482:</span> <span class="k"> *</span>
<a name="483" /><span class="True">     483:</span> <span class="k"> * Caller must check the pointer with access_ok() before calling this</span>
<a name="484" /><span class="True">     484:</span> <span class="k"> * function.</span>
<a name="485" /><span class="True">     485:</span> <span class="k"> *</span>
<a name="486" /><span class="True">     486:</span> <span class="k"> * Returns zero on success, or -EFAULT on error.</span>
<a name="487" /><span class="True">     487:</span> <span class="k"> */</span>
<a name="488" /><span class="True">     488:</span> 
<a name="489" /><span class="True">     489:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl8w"><span class="b">__put_user</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>                        \
<a name="490" /><span class="True">     490:</span>     <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9ub2NoZWNrXzA_"><span class="b">__put_user_nocheck</span></a><span class="f">(</span><span class="f">(</span><span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="491" /><span class="True">     491:</span> 
<a name="492" /><span class="True">     492:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl91bmFsaWduZWRfMA__"><span class="b">__get_user_unaligned</span></a> <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl8w"><span class="b">__get_user</span></a>
<a name="493" /><span class="True">     493:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl91bmFsaWduZWRfMA__"><span class="b">__put_user_unaligned</span></a> <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl8w"><span class="b">__put_user</span></a>
<a name="494" /><span class="True">     494:</span> 
<a name="495" /><span class="True">     495:</span> <span class="k">/*</span>
<a name="496" /><span class="True">     496:</span> <span class="k"> * {get|put}_user_try and catch</span>
<a name="497" /><span class="True">     497:</span> <span class="k"> *</span>
<a name="498" /><span class="True">     498:</span> <span class="k"> * get_user_try {</span>
<a name="499" /><span class="True">     499:</span> <span class="k"> *    get_user_ex(...);</span>
<a name="500" /><span class="True">     500:</span> <span class="k"> * } get_user_catch(err)</span>
<a name="501" /><span class="True">     501:</span> <span class="k"> */</span>
<a name="502" /><span class="True">     502:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Z2V0X3VzZXJfdHJ5XzA_"><span class="b">get_user_try</span></a>        <a href="cpu.c_macros_noref.html#_dWFjY2Vzc190cnlfMA__"><span class="b">uaccess_try</span></a>
<a name="503" /><span class="True">     503:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Z2V0X3VzZXJfY2F0Y2hfMA__"><span class="b">get_user_catch</span></a><span class="f">(</span><span class="b">err</span><span class="f">)</span>    <a href="cpu.c_macros_noref.html#_dWFjY2Vzc19jYXRjaF8w"><span class="b">uaccess_catch</span></a><span class="f">(</span><span class="b">err</span><span class="f">)</span>
<a name="504" /><span class="True">     504:</span> 
<a name="505" /><span class="True">     505:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Z2V0X3VzZXJfZXhfMA__"><span class="b">get_user_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>    <span class="m">do</span> <span class="f">{</span>                    \
<a name="506" /><span class="True">     506:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__gue_val</span><span class="f">;</span>                    \
<a name="507" /><span class="True">     507:</span>     <a href="cpu.c_macros_noref.html#_X19nZXRfdXNlcl9zaXplX2V4XzA_"><span class="b">__get_user_size_ex</span></a><span class="f">(</span><span class="f">(</span><span class="b">__gue_val</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>    \
<a name="508" /><span class="True">     508:</span>     <span class="f">(</span><span class="b">x</span><span class="f">)</span> <span class="f">=</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="b">__gue_val</span><span class="f">;</span>            \
<a name="509" /><span class="True">     509:</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="510" /><span class="True">     510:</span> 
<a name="511" /><span class="True">     511:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cHV0X3VzZXJfdHJ5XzA_"><span class="b">put_user_try</span></a>        <a href="cpu.c_macros_noref.html#_dWFjY2Vzc190cnlfMA__"><span class="b">uaccess_try</span></a>
<a name="512" /><span class="True">     512:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cHV0X3VzZXJfY2F0Y2hfMA__"><span class="b">put_user_catch</span></a><span class="f">(</span><span class="b">err</span><span class="f">)</span>    <a href="cpu.c_macros_noref.html#_dWFjY2Vzc19jYXRjaF8w"><span class="b">uaccess_catch</span></a><span class="f">(</span><span class="b">err</span><span class="f">)</span>
<a name="513" /><span class="True">     513:</span> 
<a name="514" /><span class="True">     514:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cHV0X3VzZXJfZXhfMA__"><span class="b">put_user_ex</span></a><span class="f">(</span><span class="b">x</span><span class="f">,</span> <span class="b">ptr</span><span class="f">)</span>                        \
<a name="515" /><span class="True">     515:</span>     <a href="cpu.c_macros_noref.html#_X19wdXRfdXNlcl9zaXplX2V4XzA_"><span class="b">__put_user_size_ex</span></a><span class="f">(</span><span class="f">(</span><span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">(</span><span class="b">x</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="516" /><span class="True">     516:</span> 
<a name="517" /><span class="True">     517:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span>
<a name="518" /><span class="True">     518:</span> <span class="b">copy_from_user_nmi</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="519" /><span class="True">     519:</span> <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="m">long</span>
<a name="520" /><span class="True">     520:</span> <span class="b">strncpy_from_user</span><span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="b">dst</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">src</span><span class="f">,</span> <span class="m">long</span> <span class="b">count</span><span class="f">)</span><span class="f">;</span>
<a name="521" /><span class="True">     521:</span> 
<a name="522" /><span class="True">     522:</span> <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="m">long</span> <span class="b">strlen_user</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">str</span><span class="f">)</span><span class="f">;</span>
<a name="523" /><span class="True">     523:</span> <span class="m">extern</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="m">long</span> <span class="b">strnlen_user</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">str</span><span class="f">,</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="524" /><span class="True">     524:</span> 
<a name="525" /><span class="True">     525:</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">clear_user</span><span class="f">(</span><span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">mem</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="526" /><span class="True">     526:</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">__clear_user</span><span class="f">(</span><span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">mem</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">len</span><span class="f">)</span><span class="f">;</span>
<a name="527" /><span class="True">     527:</span> 
<a name="528" /><span class="True">     528:</span> <span class="k">/*</span>
<a name="529" /><span class="True">     529:</span> <span class="k"> * movsl can be slow when source and dest are not both 8-byte aligned</span>
<a name="530" /><span class="True">     530:</span> <span class="k"> */</span>
<a name="531" /><span class="False">     531:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_INTEL_USERCOPY</span>
<a name="532" /><span class="False">     532:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">movsl_mask</span> <span class="f">{</span>
<a name="533" /><span class="False">     533:</span>     <span class="m">int</span> <span class="b">mask</span><span class="f">;</span>
<a name="534" /><span class="False">     534:</span> <span class="f">}</span> <a href="cpu.c_macros_ref.html#_X19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcF8w"><span class="b">____cacheline_aligned_in_smp</span></a> <span class="b">movsl_mask</span><span class="f">;</span>
<a name="535" /><span class="True">     535:</span> <span class="f">#</span><span class="n">endif</span>
<a name="536" /><span class="True">     536:</span> 
<a name="537" /><span class="True">     537:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_QVJDSF9IQVNfTk9DQUNIRV9VQUNDRVNTXzA_"><span class="b">ARCH_HAS_NOCACHE_UACCESS</span></a> <span class="c">1</span>
<a name="538" /><span class="True">     538:</span> 
<a name="539" /><span class="False">     539:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="540" /><span class="False">     540:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">uaccess_32</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="541" /><span class="True">     541:</span> <span class="f">#</span><span class="n">else</span>
<a name="542" /><span class="True">     542:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">uaccess_64</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="543" /><span class="True">     543:</span> <span class="f">#</span><span class="n">endif</span>
<a name="544" /><span class="True">     544:</span> 
<a name="545" /><span class="True">     545:</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">_copy_from_user</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">from</span><span class="f">,</span>
<a name="546" /><span class="True">     546:</span>                        <span class="m">unsigned</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="547" /><span class="True">     547:</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">_copy_to_user</span><span class="f">(</span><span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span>
<a name="548" /><span class="True">     548:</span>                      <span class="m">unsigned</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="549" /><span class="True">     549:</span> 
<a name="550" /><span class="False">     550:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_STRICT_USER_COPY_CHECKS</span>
<a name="551" /><span class="False">     551:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_Y29weV91c2VyX2RpYWdfMA__"><span class="b">copy_user_diag</span></a> <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9lcnJvcl8w"><span class="b">__compiletime_error</span></a>
<a name="552" /><span class="True">     552:</span> <span class="f">#</span><span class="n">else</span>
<a name="553" /><span class="True">     553:</span> <span class="f">#</span> <span class="n">define</span> <a href="cpu.c_macros_ref.html#_Y29weV91c2VyX2RpYWdfMA__"><span class="b">copy_user_diag</span></a> <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV93YXJuaW5nXzA_"><span class="b">__compiletime_warning</span></a>
<a name="554" /><span class="True">     554:</span> <span class="f">#</span><span class="n">endif</span>
<a name="555" /><span class="True">     555:</span> 
<a name="556" /><span class="True">     556:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_ref.html#_Y29weV91c2VyX2RpYWdfMA__"><span class="b">copy_user_diag</span></a><span class="f">(</span><span class="e">&quot;copy_from_user() buffer size is too small&quot;</span><span class="f">)</span>
<a name="557" /><span class="True">     557:</span> <span class="b">copy_from_user_overflow</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="558" /><span class="True">     558:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_ref.html#_Y29weV91c2VyX2RpYWdfMA__"><span class="b">copy_user_diag</span></a><span class="f">(</span><span class="e">&quot;copy_to_user() buffer size is too small&quot;</span><span class="f">)</span>
<a name="559" /><span class="True">     559:</span> <span class="b">copy_to_user_overflow</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">__asm__</span><span class="f">(</span><span class="e">&quot;copy_from_user_overflow&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="560" /><span class="True">     560:</span> 
<a name="561" /><span class="True">     561:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_Y29weV91c2VyX2RpYWdfMA__"><span class="b">copy_user_diag</span></a>
<a name="562" /><span class="True">     562:</span> 
<a name="563" /><span class="False">     563:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_STRICT_USER_COPY_CHECKS</span>
<a name="564" /><span class="False">     564:</span> 
<a name="565" /><span class="False">     565:</span> <span class="m">extern</span> <span class="m">void</span>
<a name="566" /><span class="False">     566:</span> <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV93YXJuaW5nXzA_"><span class="b">__compiletime_warning</span></a><span class="f">(</span><span class="e">&quot;copy_from_user() buffer size is not provably correct&quot;</span><span class="f">)</span>
<a name="567" /><span class="False">     567:</span> <span class="b">__copy_from_user_overflow</span><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">__asm__</span><span class="f">(</span><span class="e">&quot;copy_from_user_overflow&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="568" /><span class="False">     568:</span> <span class="f">#</span><span class="n">define</span> <span class="b">__copy_from_user_overflow</span><span class="f">(</span><span class="b">size</span><span class="f">,</span> <span class="b">count</span><span class="f">)</span> <span class="b">__copy_from_user_overflow</span><span class="f">(</span><span class="f">)</span>
<a name="569" /><span class="False">     569:</span> 
<a name="570" /><span class="False">     570:</span> <span class="m">extern</span> <span class="m">void</span>
<a name="571" /><span class="False">     571:</span> <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV93YXJuaW5nXzA_"><span class="b">__compiletime_warning</span></a><span class="f">(</span><span class="e">&quot;copy_to_user() buffer size is not provably correct&quot;</span><span class="f">)</span>
<a name="572" /><span class="False">     572:</span> <a href="cpu.c_macros_ref.html#_X19jb3B5X3RvX3VzZXJfb3ZlcmZsb3dfMA__"><span class="b">__copy_to_user_overflow</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">__asm__</span><span class="f">(</span><span class="e">&quot;copy_from_user_overflow&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="573" /><span class="False">     573:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19jb3B5X3RvX3VzZXJfb3ZlcmZsb3dfMA__"><span class="b">__copy_to_user_overflow</span></a><span class="f">(</span><span class="b">size</span><span class="f">,</span> <span class="b">count</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_X19jb3B5X3RvX3VzZXJfb3ZlcmZsb3dfMA__"><span class="b">__copy_to_user_overflow</span></a><span class="f">(</span><span class="f">)</span>
<a name="574" /><span class="False">     574:</span> 
<a name="575" /><span class="True">     575:</span> <span class="f">#</span><span class="n">else</span>
<a name="576" /><span class="True">     576:</span> 
<a name="577" /><span class="True">     577:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span>
<a name="578" /><span class="True">     578:</span> <span class="b">__copy_from_user_overflow</span><span class="f">(</span><span class="m">int</span> <span class="b">size</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">count</span><span class="f">)</span>
<a name="579" /><span class="True">     579:</span> <span class="f">{</span>
<a name="580" /><span class="True">     580:</span>     <a href="cpu.c_macros_ref.html#_V0FSTl8w"><span class="b">WARN</span></a><span class="f">(</span><span class="c">1</span><span class="f">,</span> <span class="e">&quot;Buffer overflow detected (%d &lt; %lu)!\n&quot;</span><span class="f">,</span> <span class="b">size</span><span class="f">,</span> <span class="b">count</span><span class="f">)</span><span class="f">;</span>
<a name="581" /><span class="True">     581:</span> <span class="f">}</span>
<a name="582" /><span class="True">     582:</span> 
<a name="583" /><span class="True">     583:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19jb3B5X3RvX3VzZXJfb3ZlcmZsb3dfMA__"><span class="b">__copy_to_user_overflow</span></a> <span class="b">__copy_from_user_overflow</span>
<a name="584" /><span class="True">     584:</span> 
<a name="585" /><span class="True">     585:</span> <span class="f">#</span><span class="n">endif</span>
<a name="586" /><span class="True">     586:</span> 
<a name="587" /><span class="True">     587:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a>
<a name="588" /><span class="True">     588:</span> <span class="b">copy_from_user</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span>
<a name="589" /><span class="True">     589:</span> <span class="f">{</span>
<a name="590" /><span class="True">     590:</span>     <span class="m">int</span> <span class="b">sz</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9vYmplY3Rfc2l6ZV8w"><span class="b">__compiletime_object_size</span></a><span class="f">(</span><span class="b">to</span><span class="f">)</span><span class="f">;</span>
<a name="591" /><span class="True">     591:</span> 
<a name="592" /><span class="True">     592:</span>     <span class="b">might_fault</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="593" /><span class="True">     593:</span> 
<a name="594" /><span class="True">     594:</span>     <span class="k">/*</span>
<a name="595" /><span class="True">     595:</span> <span class="k">     * While we would like to have the compiler do the checking for us</span>
<a name="596" /><span class="True">     596:</span> <span class="k">     * even in the non-constant size case, any false positives there are</span>
<a name="597" /><span class="True">     597:</span> <span class="k">     * a problem (especially when DEBUG_STRICT_USER_COPY_CHECKS, but even</span>
<a name="598" /><span class="True">     598:</span> <span class="k">     * without - the [hopefully] dangerous looking nature of the warning</span>
<a name="599" /><span class="True">     599:</span> <span class="k">     * would make people go look at the respecitive call sites over and</span>
<a name="600" /><span class="True">     600:</span> <span class="k">     * over again just to find that there&apos;s no problem).</span>
<a name="601" /><span class="True">     601:</span> <span class="k">     *</span>
<a name="602" /><span class="True">     602:</span> <span class="k">     * And there are cases where it&apos;s just not realistic for the compiler</span>
<a name="603" /><span class="True">     603:</span> <span class="k">     * to prove the count to be in range. For example when multiple call</span>
<a name="604" /><span class="True">     604:</span> <span class="k">     * sites of a helper function - perhaps in different source files -</span>
<a name="605" /><span class="True">     605:</span> <span class="k">     * all doing proper range checking, yet the helper function not doing</span>
<a name="606" /><span class="True">     606:</span> <span class="k">     * so again.</span>
<a name="607" /><span class="True">     607:</span> <span class="k">     *</span>
<a name="608" /><span class="True">     608:</span> <span class="k">     * Therefore limit the compile time checking to the constant size</span>
<a name="609" /><span class="True">     609:</span> <span class="k">     * case, and do only runtime checking for non-constant sizes.</span>
<a name="610" /><span class="True">     610:</span> <span class="k">     */</span>
<a name="611" /><span class="True">     611:</span> 
<a name="612" /><span class="True">     612:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">sz</span> <span class="f">&lt;</span> <span class="c">0</span> <span class="f">||</span> <span class="b">sz</span> <span class="f">&gt;=</span> <span class="b">n</span><span class="f">)</span><span class="f">)</span>
<a name="613" /><span class="True">     613:</span>         <span class="b">n</span> <span class="f">=</span> <span class="b">_copy_from_user</span><span class="f">(</span><span class="b">to</span><span class="f">,</span> <span class="b">from</span><span class="f">,</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="614" /><span class="True">     614:</span>     <span class="m">else</span> <span class="m">if</span><span class="f">(</span><span class="b">__builtin_constant_p</span><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">)</span>
<a name="615" /><span class="True">     615:</span>         <span class="b">copy_from_user_overflow</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="616" /><span class="True">     616:</span>     <span class="m">else</span>
<a name="617" /><span class="True">     617:</span>         <span class="b">__copy_from_user_overflow</span><span class="f">(</span><span class="b">sz</span><span class="f">,</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="618" /><span class="True">     618:</span> 
<a name="619" /><span class="True">     619:</span>     <span class="m">return</span> <span class="b">n</span><span class="f">;</span>
<a name="620" /><span class="True">     620:</span> <span class="f">}</span>
<a name="621" /><span class="True">     621:</span> 
<a name="622" /><span class="True">     622:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a>
<a name="623" /><span class="True">     623:</span> <span class="b">copy_to_user</span><span class="f">(</span><span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="b">to</span><span class="f">,</span> <span class="m">const</span> <span class="m">void</span> <span class="f">*</span><span class="b">from</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span>
<a name="624" /><span class="True">     624:</span> <span class="f">{</span>
<a name="625" /><span class="True">     625:</span>     <span class="m">int</span> <span class="b">sz</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9vYmplY3Rfc2l6ZV8w"><span class="b">__compiletime_object_size</span></a><span class="f">(</span><span class="b">from</span><span class="f">)</span><span class="f">;</span>
<a name="626" /><span class="True">     626:</span> 
<a name="627" /><span class="True">     627:</span>     <span class="b">might_fault</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="628" /><span class="True">     628:</span> 
<a name="629" /><span class="True">     629:</span>     <span class="k">/* See the comment in copy_from_user() above. */</span>
<a name="630" /><span class="True">     630:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_bGlrZWx5XzA_"><span class="b">likely</span></a><span class="f">(</span><span class="b">sz</span> <span class="f">&lt;</span> <span class="c">0</span> <span class="f">||</span> <span class="b">sz</span> <span class="f">&gt;=</span> <span class="b">n</span><span class="f">)</span><span class="f">)</span>
<a name="631" /><span class="True">     631:</span>         <span class="b">n</span> <span class="f">=</span> <span class="b">_copy_to_user</span><span class="f">(</span><span class="b">to</span><span class="f">,</span> <span class="b">from</span><span class="f">,</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="632" /><span class="True">     632:</span>     <span class="m">else</span> <span class="m">if</span><span class="f">(</span><span class="b">__builtin_constant_p</span><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">)</span>
<a name="633" /><span class="True">     633:</span>         <span class="b">copy_to_user_overflow</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="634" /><span class="True">     634:</span>     <span class="m">else</span>
<a name="635" /><span class="True">     635:</span>         <a href="cpu.c_macros_ref.html#_X19jb3B5X3RvX3VzZXJfb3ZlcmZsb3dfMA__"><span class="b">__copy_to_user_overflow</span></a><span class="f">(</span><span class="b">sz</span><span class="f">,</span> <span class="b">n</span><span class="f">)</span><span class="f">;</span>
<a name="636" /><span class="True">     636:</span> 
<a name="637" /><span class="True">     637:</span>     <span class="m">return</span> <span class="b">n</span><span class="f">;</span>
<a name="638" /><span class="True">     638:</span> <span class="f">}</span>
<a name="639" /><span class="True">     639:</span> 
<a name="640" /><span class="True">     640:</span> <span class="f">#</span><span class="n">undef</span> <span class="b">__copy_from_user_overflow</span>
<a name="641" /><span class="True">     641:</span> <span class="f">#</span><span class="n">undef</span> <a href="cpu.c_macros_ref.html#_X19jb3B5X3RvX3VzZXJfb3ZlcmZsb3dfMA__"><span class="b">__copy_to_user_overflow</span></a>
<a name="642" /><span class="True">     642:</span> 
<a name="643" /><span class="True">     643:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _ASM_X86_UACCESS_H */</span>
<a name="644" /><span class="True">     644:</span> 
<a name="645" /><span class="True">     645:</span> </pre>
  </body>
</html>
